package com.example.fitts_app

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.fitts_app.databinding.ActivityMainBinding
import kotlin.math.min

class MainActivity : AppCompatActivity() {

    // 声明 ViewBinding 对象
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)


        // 开始实验按钮
        binding.startButton.setOnClickListener {
            // 如果输入框为空，使用 null 表示随机模式，而不是默认值
            val inputD = binding.inputD.text.toString().toFloatOrNull()
            val inputW = binding.inputW.text.toString().toFloatOrNull()
            
            // 用于验证的 D 和 W 值（如果为空则使用默认值）
            val checkD = inputD ?: 61f
            val checkW = inputW ?: 25f

            val viewWidth = binding.fittsView.width.toFloat()
            val viewHeight = binding.fittsView.height.toFloat()

            val maxW = 200f  // 最大控件宽度，防止太大
            val redWidthSize = checkW
            val redHeightSize = checkW
            val diagonalRed = Math.sqrt(
                (redWidthSize / 2).toDouble().pow(2.0) +
                        (redHeightSize / 2).toDouble().pow(2.0)
            ).toFloat()
            val maxD = min(viewWidth, viewHeight) / 2 - diagonalRed

            val diagonalGreen = (120f * Math.sqrt(2.0)).toFloat()
            // 检查 D 和 W 的输入有效性
            val minD = diagonalGreen / 2 + diagonalRed / 2

            if (checkW <= 0f) {
                Toast.makeText(this, "输入的 W 必须大于 0", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            if(checkW<30f&&checkW!=25f){
                Toast.makeText(this, "输入的 W 太小", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            // 只有当用户输入了D值时才检查（inputD != null）
            if(inputD != null && inputD < minD)
            {
                Toast.makeText(this,"输入的D太小", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            if (inputD != null && inputD > maxD) {
                Toast.makeText(this, "输入的 D 太大", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            if (inputW != null && inputW > maxW) {
                Toast.makeText(this, "输入的 W 太大", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            // 设置实际使用的 D 和 W（如果用户没有输入，使用默认值触发随机模式）
            binding.fittsView.D = inputD ?: 61f
            binding.fittsView.W = inputW ?: 25f
            // 保存用户输入的原始值（null 表示没有输入，使用随机）
            binding.fittsView.inputD = inputD
            binding.fittsView.inputW = inputW
            binding.fittsView.refreshTargets()
        }

        // 清除数据按钮
        binding.clearButton.setOnClickListener {
            clearMemoryData()
            binding.inputD.text.clear()
            binding.inputW.text.clear()
            binding.fittsView.D = 61f
            binding.fittsView.W = 25f
            binding.fittsView.inputD = null  // 清除用户输入，恢复随机模式
            binding.fittsView.inputW = null  // 清除用户输入，恢复随机模式
            binding.fittsView.resetView()
            Toast.makeText(this, "数据与参数已清除", Toast.LENGTH_SHORT).show()
        }

        // 查看散点图按钮
        binding.toggleViewButton.setOnClickListener {
            if (FittsDataHolder.records.isEmpty()) {
                Toast.makeText(this, "暂无实验数据，请先进行实验", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            val intent = Intent(this, ChartActivity::class.java)
            startActivity(intent)
            // 销毁当前界面，释放资源
            finish()
        }
    }


    /**
     * 清空内存中的数据
     */
    private fun clearMemoryData() {
        FittsDataHolder.records.clear()
    }
    // 注意：不再在 onDestroy 中清除数据，因为用户可能通过返回键返回 MainActivity
    // 如果清除数据，会导致 ChartActivity 无法访问数据
    private fun Double.pow(power: Double) = Math.pow(this, power)
}
